package com.datastructures.spaseArray;

/**
 * 稀疏数组
 * @author MaoLin Wang
 * @date 2019/10/1718:24
 */
public class sparseArray {
    public static void main(String[] args) {
        /**
         * 创建一个10*10的原始二维数组
         * 0:没有棋子 1：黑子 2：白子
         */
        int chessArr1[][]=new int[10][11];
        chessArr1[1][2]=1;
        chessArr1[2][3]=2;
        chessArr1[4][5]=2;

        System.out.println("初始二维数组");
        for (int[] row : chessArr1){
            for (int data:row){
                System.out.printf("%d\t",data);
            }
            System.out.println();
        }

        /**
         * 二维数组转为稀疏数组
         */
        //非0数据个数
        int sum=0;
        for(int i=0;i<chessArr1.length;i++){
            for(int j=0;j<chessArr1[0].length;j++){
                if(chessArr1[i][j]!=0){
                    sum++;
                }
            }
        }
        System.out.println("非0数据共有："+sum);//2个


        //2.创建稀疏数组
        int sparseArr[][]=new int[sum+1][3];

        sparseArr[0][0]=chessArr1.length;//行数
        sparseArr[0][1]=chessArr1[0].length;//列数
        sparseArr[0][2]=sum;//非0数据个数

        //存储非0数据
        int count=0;//记录第几个非0数据
        for (int i=0;i<chessArr1.length;i++){
            for (int j=0;j<chessArr1[0].length;j++){
                if(chessArr1[i][j]!=0){
                    count++;
                    sparseArr[count][0]=i;
                    sparseArr[count][1]=j;
                    sparseArr[count][2]=chessArr1[i][j];

                }
            }
        }

        //输出稀疏数组
        System.out.println();
        System.out.println("稀疏数组：");
        for (int i=0;i<sparseArr.length;i++){
            System.out.println(sparseArr[i][0]+" "+sparseArr[i][1]+" "+sparseArr[i][2]);
        }


        /**
         * 稀疏数组回复为二维数组
         */
        //1.读取稀疏数组的第一行，根据第一行的数据创建原始的二维数组
        int chessArr2[][]=new int[sparseArr[0][0]][sparseArr[0][1]];
        //2.读取稀疏数组后几行数据，并赋给原始二维数组
        for (int i=1;i<sparseArr.length;i++){
            chessArr2[sparseArr[i][0]][sparseArr[i][1]]=sparseArr[i][2];
        }
        System.out.println();
        System.out.println("恢复后的数组:");
        for(int []row : chessArr2){
            for(int data:row){
                System.out.printf("%d\t",data);
            }
            System.out.println();
        }
    }

}
